// utils/request.js

class Request {
  constructor() {
    this._baseURL = 'http://192.168.88.134:5000' // 替换为你的基础URL
    this._timeout = 10000 // 10秒超时
  }

  /**
   * 基础请求方法
   * @param {string} method 请求方法
   * @param {string} url 请求地址
   * @param {object} data 请求参数
   * @param {object} options 额外配置
   */
  async request(method, url, data = {}, options = {}) {
    // 合并配置
    const config = {
      url: `${this._baseURL}${url}`,
      method: method,
      data: data,
      timeout: this._timeout,
      header: {
        'Content-Type': 'application/json',
        ...this._getAuthHeader(options.needAuth),
        ...(options.header || {})
      }
    }

    try {
      // 请求拦截
      this._requestInterceptor(options)

      // 发起请求
      const response = await new Promise((resolve, reject) => {
        wx.request({
          ...config,
          success: res => resolve(res),
          fail: err => reject(err)
        })
      })

      // 响应拦截
      return this._responseInterceptor(response, options)
    } catch (error) {
      // 错误处理
      this._handleError(error, options)
      throw error
    }
  }

  // GET 请求
  get(url, params = {}, options = {}) {
    return this.request('GET', url, params, options)
  }

  // POST 请求
  post(url, data = {}, options = {}) {
    return this.request('POST', url, data, options)
  }

  // PUT 请求
  put(url, data = {}, options = {}) {
    return this.request('PUT', url, data, options)
  }

  // DELETE 请求
  delete(url, data = {}, options = {}) {
    return this.request('DELETE', url, data, options)
  }

  // 获取认证头信息
  _getAuthHeader(needAuth = true) {
    if (!needAuth) return {}
    
    const token = wx.getStorageSync('token')
    if (!token) {
      wx.navigateTo({ url: '/pages/login/login' })
      throw new Error('未找到有效Token')
    }
    return { Authorization: `Bearer ${token}` }
  }

  // 请求拦截器
  _requestInterceptor(options) {
    if (options.showLoading !== false) {
      wx.showLoading({ title: '加载中...', mask: true })
    }
  }

  // 响应拦截器
  _responseInterceptor(response, options) {
    if (options.showLoading !== false) {
      wx.hideLoading()
    }

    const { statusCode, data } = response
    if (statusCode === 401) {
      wx.removeStorageSync('token')
      wx.navigateTo({ url: '/pages/login/login' })
      throw new Error('登录已过期，请重新登录')
    }

    if (statusCode < 200 || statusCode >= 300) {
      throw new Error(`请求失败，状态码：${statusCode}`)
    }

    // 这里根据你的后端接口结构进行调整
    if (data.code !== 0) {
      const errorMsg = data.msg || '请求失败，请稍后重试'
      if (options.showError !== false) {
        wx.showToast({ title: errorMsg, icon: 'none' })
      }
      throw new Error(errorMsg)
    }

    return data.data
  }

  // 错误处理
  _handleError(error, options) {
    if (options.showLoading !== false) {
      wx.hideLoading()
    }

    const errorMessage = error.errMsg || '请求失败，请检查网络连接'
    if (options.showError !== false) {
      wx.showToast({ title: errorMessage, icon: 'none' })
    }

    // 特殊错误处理
    if (error.errMsg.includes('timeout')) {
      console.error('请求超时:', error)
    } else {
      console.error('请求错误:', error)
    }
  }
}

// 创建实例并导出
const request = new Request()
export default request